Serilog是一款以結構化紀錄的Log框架,可用於輸出檔案或存入資料庫,透過結構化的設計可以讓Logging更便利進行查詢與分析。
今天我們就重新建一個名為SerilogSample的WebAPI專案,一步一步設置並使用Serilog。
首先,先使用terminal建立一個全新專案,輸入以下指令dotnet new webapi -o SerilogSample完畢之後cd SerilogSample進入目錄
接著需要透過Nuget安裝Serilog的套件:dotnet add package Serilog.AspNetCore
將Program.cs中的Main()修改如下
public static int Main(string[] args)
{
    Log.Logger = new LoggerConfiguration()
        .MinimumLevel.Debug()
        .MinimumLevel.Override("Microsoft", LogEventLevel.Information)
        .Enrich.FromLogContext()
        .WriteTo.Console()
        .CreateLogger();
    try
    {
        Log.Information("Starting web host");
        CreateHostBuilder(args).Build().Run();
        return 0;
    }
    catch (Exception ex)
    {
        Log.Fatal(ex, "Host terminated unexpectedly");
        return 1;
    }
    finally
    {
        Log.CloseAndFlush();
    }
}
這邊的WriteTo.Console()設置將Log輸出到終端機的畫面上
接著在CreateHostBuilder()中設定使用Serilog
public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .UseSerilog() //在此加入
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>();
        });
加入的位置決定啟動的順序,加在ConfigureWebHostDefaults前可以在Host設置完成之前開始進行記錄。
第三步將appsettings.json中的 Logging 區段移除並加入Serilog的區段
"Serilog": {
  "MinimumLevel": {
    "Default": "Information",
    "Override": {
      "Microsoft": "Warning",
      "System": "Warning"
    }
  }
}
最後為了能更詳細的紀錄每一個Request的資訊,我們需要在Starup.Configure中加入 app.UseSerilogRequestLogging();
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    app.UseHttpsRedirection();
    app.UseSerilogRequestLogging(); //在這邊加入
    app.UseRouting();
    app.UseAuthorization();
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });
}
設置完畢之後在目錄底下輸入dotnet run開始運行應用程式,便可以看到輸出的Log

接著我們在WeatherForecastController的Get()這個Action中加入各等級的logging
[HttpGet]
public IEnumerable<WeatherForecast> Get()
{
    _logger.LogInformation("Info!");
    _logger.LogWarning("Warning!");
    _logger.LogTrace("Trace!");
    _logger.LogDebug("Debug");
    _logger.LogCritical("Critical");
    _logger.LogError("Error");
    var rng = new Random();
    return Enumerable.Range(1, 5).Select(index => new WeatherForecast
    {
        Date = DateTime.Now.AddDays(index),
        TemperatureC = rng.Next(-20, 55),
        Summary = Summaries[rng.Next(Summaries.Length)]
    })
    .ToArray();
}
加入完畢後對這個Action發出Request,可以看到我們所記錄的各等級Log
除此之外,由於剛才在Middleware有設定app.UseSerilogRequestLogging(),所以在各等級的Log之前,可以看到Request的詳細資訊。
Seq 是一款集中Logging的服務,他提供了介面化的服務,讓開發人員可以透過Seq提供的搜尋功能,快速查找紀錄,並可以從圖表中觀察到應用程式的運行狀況。
在Windows的環境底下可以透過下載頁面進行下載及安裝Seq。
在macOS或是linux的環境上,Seq官方只提供使用Docker的方式進行安裝。
首先要透過terminal輸入docker指令docker pull datalust/seq:latest把seq最新版的映像檔(image)抓下來
接著透過docker run --name seq -d --restart unless-stopped -e ACCEPT_EULA=Y -p 5341:80 datalust/seq:latest啟動以Seq映像檔建立的容器。
啟動完畢後,透過瀏覽器訪問 http://localhost:5341 就可以看到成功啟動的Seq服務了。

要將Serilog的記錄寫入Seq,需要在專案底下安裝Serilog.Sinks.Seq套件dotnet add package Serilog.Sinks.Seq
並將Program.Main中的.WriteTo.Console()改為.WriteTo.Seq("http://localhost:5341")
加入完畢之後可以再啟動一次專案,並訪問https://localhost:5001/WeatherForecast
就可以看到紀錄成功寫進Seq當中了